/*
 * @Author: Kiro AI Assistant
 * @Date: 2025-01-10
 * @Description: iOS 权限处理助手 - 专门处理 iOS 平台的权限相关问题
 */

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';

/// iOS 权限处理助手
/// 专门处理 iOS 平台权限请求的特殊情况
class IOSPermissionHelper {
  /// 单例模式
  static IOSPermissionHelper? _instance;
  static IOSPermissionHelper get instance {
    _instance ??= IOSPermissionHelper._internal();
    return _instance!;
  }

  IOSPermissionHelper._internal();

  /// 安全地请求 iOS 权限
  /// 避免权限请求过程中的崩溃问题
  Future<Map<Permission, PermissionStatus>> safeRequestPermissions(
    List<Permission> permissions,
  ) async {
    if (!Platform.isIOS) {
      // 非 iOS 平台直接批量请求
      return await permissions.request();
    }

    Map<Permission, PermissionStatus> results = {};

    for (Permission permission in permissions) {
      try {
        debugPrint('IOSPermissionHelper: 请求权限 - $permission');

        // 先检查当前状态
        final currentStatus = await _safeCheckPermissionStatus(permission);
        if (currentStatus == PermissionStatus.granted) {
          results[permission] = currentStatus;
          continue;
        }

        // 请求权限
        final status = await _safeRequestSinglePermission(permission);
        results[permission] = status;

        // iOS 权限请求之间添加延迟，避免系统对话框冲突
        await Future.delayed(const Duration(milliseconds: 200));
      } catch (error) {
        debugPrint('IOSPermissionHelper: 请求权限失败 - $permission: $error');
        results[permission] = PermissionStatus.denied;
      }
    }

    return results;
  }

  /// 安全地检查权限状态
  Future<PermissionStatus> _safeCheckPermissionStatus(
      Permission permission) async {
    try {
      return await permission.status;
    } catch (error) {
      debugPrint('IOSPermissionHelper: 检查权限状态失败 - $permission: $error');
      return PermissionStatus.denied;
    }
  }

  /// 安全地请求单个权限
  Future<PermissionStatus> _safeRequestSinglePermission(
      Permission permission) async {
    try {
      // 使用 try-catch 包装权限请求，避免系统级崩溃
      final status = await permission.request();
      debugPrint('IOSPermissionHelper: 权限请求结果 - $permission: $status');
      return status;
    } catch (error) {
      debugPrint('IOSPermissionHelper: 单个权限请求失败 - $permission: $error');

      // 某些 iOS 版本或设备可能不支持特定权限
      // 返回 denied 而不是抛出异常
      return PermissionStatus.denied;
    }
  }

  /// 检查是否为 iOS 平台的已知权限问题
  bool isKnownIOSPermissionIssue(Permission permission, dynamic error) {
    if (!Platform.isIOS) return false;

    final errorString = error.toString().toLowerCase();

    // 检查常见的 iOS 权限错误
    final knownErrors = [
      'permission not found',
      'permission not supported',
      'invalid permission',
      'permission handler error',
      'ios permission error',
    ];

    return knownErrors.any((knownError) => errorString.contains(knownError));
  }

  /// 获取 iOS 平台安全的权限列表
  /// 过滤掉可能导致崩溃的权限
  List<Permission> getSafeIOSPermissions(List<Permission> permissions) {
    if (!Platform.isIOS) return permissions;

    // iOS 平台只保留确实需要且安全的权限
    final safePermissions = <Permission>[];

    for (Permission permission in permissions) {
      switch (permission) {
        case Permission.notification:
          // 通知权限在 iOS 上是安全的
          safePermissions.add(permission);
          break;
        case Permission.audio:
          // 音频权限在某些 iOS 版本可能有问题，但通常是安全的
          safePermissions.add(permission);
          break;
        default:
          // 其他权限需要谨慎处理
          debugPrint('IOSPermissionHelper: 跳过可能不安全的权限 - $permission');
          break;
      }
    }

    return safePermissions;
  }

  /// 处理 iOS 权限请求的用户体验
  /// 提供更友好的错误处理和用户引导
  Future<bool> handleIOSPermissionFlow(
    BuildContext context,
    List<Permission> permissions,
  ) async {
    try {
      // 获取安全的权限列表
      final safePermissions = getSafeIOSPermissions(permissions);

      if (safePermissions.isEmpty) {
        debugPrint('IOSPermissionHelper: 没有需要请求的安全权限');
        return true; // 没有权限需要请求，视为成功
      }

      // 安全地请求权限
      final results = await safeRequestPermissions(safePermissions);

      // 检查结果
      final grantedCount = results.values
          .where((status) => status == PermissionStatus.granted)
          .length;

      final totalCount = results.length;

      debugPrint('IOSPermissionHelper: 权限请求完成 - $grantedCount/$totalCount 已授予');

      // iOS 平台即使部分权限被拒绝也允许继续使用
      return true;
    } catch (error) {
      debugPrint('IOSPermissionHelper: iOS权限流程处理失败 - $error');

      // iOS 平台权限处理失败时不阻止用户使用应用
      if (context.mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(
            content: Text('权限设置遇到问题，但您仍可以正常使用应用的基础功能'),
            backgroundColor: Colors.orange,
            duration: Duration(seconds: 3),
          ),
        );
      }

      return true; // 返回 true 允许继续使用
    }
  }

  /// 检查 iOS 系统版本是否支持特定权限
  Future<bool> isPermissionSupportedOnCurrentIOSVersion(
      Permission permission) async {
    if (!Platform.isIOS) return true;

    try {
      // 尝试检查权限状态来判断是否支持
      await permission.status;
      return true;
    } catch (error) {
      debugPrint('IOSPermissionHelper: 权限在当前iOS版本不支持 - $permission: $error');
      return false;
    }
  }

  /// 为 iOS 用户提供权限说明
  String getIOSPermissionExplanation(Permission permission) {
    switch (permission) {
      case Permission.notification:
        return '通知权限用于在锁屏时显示音乐播放控制，您可以在"设置 > 通知"中管理此权限';
      case Permission.audio:
        return '音频权限用于播放音乐，这是应用的核心功能';
      default:
        return '此权限用于提供更好的用户体验，您可以在系统设置中管理权限';
    }
  }

  /// 生成 iOS 权限状态报告
  Future<Map<String, dynamic>> generateIOSPermissionReport() async {
    if (!Platform.isIOS) {
      return {'platform': 'not_ios', 'message': '此报告仅适用于iOS平台'};
    }

    final report = <String, dynamic>{
      'platform': 'ios',
      'timestamp': DateTime.now().toIso8601String(),
      'permissions': <String, dynamic>{},
      'system_info': <String, dynamic>{
        'ios_version': 'unknown', // 可以通过 device_info_plus 获取
      },
    };

    final testPermissions = [
      Permission.notification,
      Permission.audio,
    ];

    for (Permission permission in testPermissions) {
      try {
        final status = await _safeCheckPermissionStatus(permission);
        final isSupported =
            await isPermissionSupportedOnCurrentIOSVersion(permission);

        report['permissions'][permission.toString()] = {
          'status': status.toString(),
          'is_granted': status == PermissionStatus.granted,
          'is_supported': isSupported,
          'explanation': getIOSPermissionExplanation(permission),
        };
      } catch (error) {
        report['permissions'][permission.toString()] = {
          'status': 'error',
          'error': error.toString(),
          'is_supported': false,
        };
      }
    }

    return report;
  }
}
